package speelotheek.models;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.text.SimpleDateFormat;

import com.mysql.jdbc.StringUtils;

import speelotheek.components.Database;
import speelotheek.components.JSqlList;

public class Speelgoed {

	private String code;
	private int category;
	private String naam;
	private String omschrijving;
	private Date aankoopdatum;
	private double aankoopbedrag;
	private int aantalonderdelen;

	private SimpleDateFormat nl = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * @return the code
	 */
	public String getCode() {
		return code;
	}
	
	/**
	 * @param code the code to set
	 */
	public void setCode(String code) {
		this.code = code;
	}

	/**
	 * @return the category
	 */
	public int getCategory() {
		return category;
	}

	/**
	 * @param category the category to set
	 */
	public void setCategory(int category) {
		this.category = category;
	}

	/**
	 * @return the naam
	 */
	public String getNaam() {
		return naam;
	}

	/**
	 * @param naam the naam to set
	 */
	public void setNaam(String naam) {
		this.naam = naam;
	}

	/**
	 * @return the omschrijving
	 */
	public String getOmschrijving() {
		return omschrijving;
	}

	/**
	 * @param omschrijving the omschrijving to set
	 */
	public void setOmschrijving(String omschrijving) {
		this.omschrijving = omschrijving;
	}

	/**
	 * @return the aankoopdatum
	 */
	public Date getAankoopdatum() {
		return aankoopdatum;
	}

	/**
	 * @param aankoopdatum the aankoopdatum to set
	 */
	public void setAankoopdatum(Date aankoopdatum) {
		this.aankoopdatum = aankoopdatum;
	}

	/**
	 * @return the aantalonderdelen
	 */
	public int getAantalonderdelen() {
		return aantalonderdelen;
	}

	/**
	 * @param aantalonderdelen the aantalonderdelen to set
	 */
	public void setAantalonderdelen(int aantalonderdelen) {
		this.aantalonderdelen = aantalonderdelen;
	}

	/**
	 * @return the aankoopbedrag
	 */
	public double getAankoopbedrag() {
		return aankoopbedrag;
	}

	/**
	 * @param aankoopbedrag the aankoopbedrag to set
	 */
	public void setAankoopbedrag(double aankoopbedrag) {
		this.aankoopbedrag = aankoopbedrag;
	}
	
	
	
	public boolean isUitgeleend()
	{
		String query = "select count(*) from uitlening where speelgoed = '" + code + "' AND ISNULL(innamedatum)";
		return Database.executeOneColumnSelectQuery(query) != null ? Integer.parseInt(Database.executeOneColumnSelectQuery(query)) > 0 : false;	
	}
	
	//haal Speelgoed op uit de database op basis van zijn code
	public static Speelgoed getSpeelgoed(String code) {
		String query = "select code, categorie, naam, omschrijving, aankoopdatum, aankoopbedrag, aantalonderdelen from speelgoed where code = '" + code + "'";
		
		//het echte werk wordt in getSpeelgoed gedaan
		Speelgoed[] ds = Speelgoed.getAllSpeelgoed(query);
		if (ds == null) {
			return null;
		}
		//we selecteren de eerste speelgoed uit het opgeleverde array
	    return ds[0];
	}
	
	  // hulpmethod om speelgoed te zoeken mbv zijn naam
	  public static Speelgoed[] getAllNaam(String naam) { 
	    String query = "select code, categorie, naam, omschrijving, aankoopdatum, aankoopbedrag, aantalonderdelen from speelgoed where naam like '%" + naam + "%'";
	    return getAllSpeelgoed(query);
	  }

	  public boolean save(){
		  if(this.code != null){
			  System.out.println("Update speelgoed");
			  return update();
		  } else {
			  System.out.println("Insert speelgoed");
			  return insert();
		  }
		  		  
	  }
	  
	  public static boolean remove(String code){
		  boolean success = false;
		  
		  String query = "DELETE FROM speelgoed WHERE code = '"+code+"'";
		  
		  switch(Database.executeDeleteQuery(query)){
		  	case -1:
		  		success = false;
		  		break;
		  	case 0:
		  	case 1:
		  		success = true;
		  		break;
		  }
		  
		  return success;
	  }
	  
	  private boolean insert(){
		  boolean success = false;
		  
		  String[] codes = getAllCodes();
		  String newCode = generateCode();

		  boolean stopLoop = false;
		  while(stopLoop == false){
			  for(int i=0;i<codes.length;i++) {
				  if(codes[i].equals(newCode)) {
					  newCode = generateCode();
					  break;
			      }
			  }
			  stopLoop = true;
	  	  }
		  
		  this.code = newCode;
		  
		  String query = "INSERT INTO speelgoed (code, categorie, naam, omschrijving, aankoopdatum, aankoopbedrag, aantalonderdelen) " +
				  			"VALUES('"+this.code+"','"+this.category+"', '"+this.naam+"', '"+this.omschrijving+"', '"+nl.format(this.aankoopdatum)+"', '"+this.aankoopbedrag+"', '"+this.aantalonderdelen+"')"; 
		  
		  switch(Database.executeInsertQuery(query)){
		  	case -1:
		  		success = false;
		  		break;
		  	case 0:
		  	case 1:
		  		success = true;
		  		break;
		  }
		  
		  return success;
	  }
	  
	  private boolean update(){
		  boolean success = false;

		  String query = "UPDATE speelgoed SET " +
						  "categorie = '"+this.category+"', " +
						  "naam = '"+this.naam+"', " +
						  "omschrijving = '"+this.omschrijving+"', " +
						  "aankoopdatum = '"+nl.format(this.aankoopdatum)+"', " +
						  "aankoopbedrag = '"+this.aankoopbedrag+"', " +
						  "aantalonderdelen = '"+this.aantalonderdelen+"' " +
						  "WHERE code = '"+this.code+"'"; 
		  
		  switch(Database.executeUpdateQuery(query)){
		  	case -1:
		  		success = false;
		  		break;
		  	case 0:
		  	case 1:
		  		success = true;
		  		break;
		  }
		  
		  return success;
	  }
	  
	  private boolean alleVeldenIngevuld() {
		  
		  /* TODO: checken of alle velden zijn ingevuld */
			
		  return true;
	  }

	  private static String generateCode(){
		  
		  Random randomGenerator = new Random();
		  
		  char[] alphas = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
		  		  
		  int randomAlpha = randomGenerator.nextInt(25);
		  
		  String randomNumber = Integer.toString(randomGenerator.nextInt(999));
		  randomNumber = ("000" + randomNumber).substring(randomNumber.length());
		  
		  String code = (String) (alphas[randomAlpha]+randomNumber);
		  System.out.println(code);
		  
		  return code;
	  }
	  
	  private static String[] getAllCodes(){
		  
		  String query = "SELECT code FROM speelgoed"; 
		  
		  ResultSet r = Database.executeSelectQuery(query);
		  ArrayList<String> codes = new ArrayList<String>(); 
		  
		  try {
		      while (r.next()) {
				codes.add(r.getString("code"));
		      }
		  } catch (SQLException e) {
		      System.out.println("Speelgoed: getSpeelgoed: " + e.toString());
		      System.out.println(e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
		  }
		  
		  String[] array = new String[codes.size()]; 
		  for(int i = 0; i < codes.size(); i++){
			  array[i] = codes.get(i);
		  }
		  return array;
		  
	  }
	  
	  private static Speelgoed[] getAllSpeelgoed(String query) {
	    //voer query uit op de database  
	    ResultSet r = Database.executeSelectQuery(query);
	    //sla straks de speelgoedgegevens op in een arraylist
	    ArrayList<Speelgoed> speelgoed = new ArrayList<Speelgoed>();
	    // haal de gegevens nu per speelgoed op en stop ze in een speelgoed object
	    try {
	      while (r.next()) {
	        Speelgoed value = new Speelgoed();
	        
	        value.setCode(r.getString("code"));
	        value.setCategory(r.getInt("categorie"));
	        value.setNaam(r.getString("naam"));
	        value.setOmschrijving(r.getString("omschrijving"));
	        value.setAankoopdatum(r.getDate("aankoopdatum"));
	        value.setAankoopbedrag(r.getDouble("aankoopbedrag"));
	        value.setAantalonderdelen(r.getInt("aantalonderdelen"));

	        //nu gaan de gegevens naar de arraylist
	        speelgoed.add(value);
	      }
	    } catch (SQLException e) {
	      System.out.println("Speelgoed: getSpeelgoed: " + e.toString());
	      System.out.println(e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
	    }
	    if(speelgoed.size() == 0)
	      System.out.println("Speelgoed: getSpeelgoed: " + "geen speelgoed uit deze query " + query);
	      
	    //nu je weet hoeveel speelgoed er gevonden zijn kun je ze in een array stoppen
	    Speelgoed[] array = new Speelgoed[speelgoed.size()];
	    for(int i = 0; i<speelgoed.size() ; i++)
	      array[i] = speelgoed.get(i);
	    return array;
	  }
	  
	  @Override
	  //print de speelgoedgegevens als tabel
	  public String toString() {
	    String output = "";
	    output += JSqlList.setSpaces(getNaam(), 20);
	    return output;
	  }
	
}
